import pymysql
import logging
from typing import List, Dict

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class MovieDAO:
    """电影数据访问对象，用于处理电影相关的数据库操作"""
    
    def __init__(self):
        """初始化电影DAO对象，设置数据库连接配置"""
        self.db_config = {
            'host': 'localhost',  # 数据库主机地址
            'user': 'root',  # 数据库用户名
            'password': '123456',  # 数据库密码
            'database': 'douban_movies',  # 数据库名称
            'charset': 'utf8mb4',  # 字符集设置
            'cursorclass': pymysql.cursors.DictCursor  # 使用字典游标，返回字典格式的结果
        }

    def get_connection(self):
        """
        获取数据库连接
        :return: 数据库连接对象
        """
        return pymysql.connect(**self.db_config)  # 使用配置创建并返回数据库连接

    def get_all_movies(self) -> List[Dict]:
        """
        获取所有电影数据并格式化
        :return: 格式化后的电影列表，包含电影的所有信息
        """
        conn = None  # 数据库连接对象
        cursor = None  # 数据库游标对象
        try:
            conn = self.get_connection()  # 获取数据库连接
            cursor = conn.cursor()  # 创建数据库游标
            
            # SQL查询：获取所有电影的基本信息
            query = """
            SELECT rank_num, title, rating, year, director, genre, intro, poster_url
            FROM movies 
            ORDER BY rank_num  # 按排名排序
            """
            cursor.execute(query)  # 执行SQL查询
            movies = cursor.fetchall()  # 获取所有查询结果
            
            # 格式化数据：将数据库结果转换为前端需要的格式
            formatted_movies = []  # 初始化格式化后的电影列表
            for movie in movies:  # 遍历每部电影
                formatted_movies.append({
                    'rank': movie['rank_num'],  # 电影排名
                    'title': movie['title'],  # 电影标题
                    'rating': float(movie['rating']),  # 电影评分（转换为浮点数）
                    'year': movie['year'],  # 上映年份
                    'director': movie['director'],  # 导演
                    'genre': movie['genre'],  # 电影类型
                    'intro': movie['intro'] if movie['intro'] != '暂无简介' else '',  # 电影简介（处理暂无简介的情况）
                    'poster': movie['poster_url']  # 电影海报URL
                })
            
            return formatted_movies  # 返回格式化后的电影列表
            
        except Exception as e:  # 捕获所有可能的异常
            logger.error(f"获取电影数据时出错: {str(e)}")  # 记录错误信息
            raise  # 重新抛出异常，让调用者处理
            
        finally:  # 确保资源正确释放
            if cursor:  # 如果游标已创建
                cursor.close()  # 关闭数据库游标
            if conn:  # 如果连接已创建
                conn.close()  # 关闭数据库连接